﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOClientes
    /// </summary>
    class DAOIMPLClientes:Presupuesto_DAO.DAOClientes
    {
        /// <summary>
        /// Guarda un cliente
        /// </summary>
        /// <param name="nombre">Nombre del cliente</param>
        /// <param name="direccion">Dirección del cliente</param>
        /// <param name="contacto">Contacto del cliente</param>
        /// <param name="mail">Mail del cliente</param>
        /// <param name="cuit">CUIT del cliente</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveCliente(string nombre, string direccion, string contacto, string mail, string cuit, bool activo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO clientes(Nombre, Direccion, Contacto, Mail, Cuit, Activo) VALUES(@nombre, @direccion, @contacto, @mail, @cuit, @activo)";
                insertar.Parameters.AddWithValue("@nombre", nombre);
                insertar.Parameters.AddWithValue("@direccion", direccion);
                insertar.Parameters.AddWithValue("@contacto", contacto);
                insertar.Parameters.AddWithValue("@mail", mail);
                insertar.Parameters.AddWithValue("@cuit", cuit);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose(); 
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un cliente
        /// </summary>
        /// <param name="nombre">Nombre del cliente</param>
        /// <param name="direccion">Dirección del cliente</param>
        /// <param name="contacto">Contacto del cliente</param>
        /// <param name="mail">Mail del cliente</param>
        /// <param name="cuit">CUIT del cliente</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <param name="idCliente">Determina el cliente a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateCliente(string nombre, string direccion, string contacto, string mail, string cuit, bool activo, int idCliente)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE clientes  SET Nombre = @nombre, Direccion = @direccion, Contacto = @contacto, Mail = @mail, Cuit = @cuit, Activo = @activo WHERE id = @idCliente";
                modificar.Parameters.AddWithValue("@nombre", nombre);
                modificar.Parameters.AddWithValue("@direccion", direccion);
                modificar.Parameters.AddWithValue("@contacto", contacto);
                modificar.Parameters.AddWithValue("@mail", mail);
                modificar.Parameters.AddWithValue("@cuit", cuit);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("@idCliente", idCliente);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un cliente
        /// </summary>
        /// <param name="nombre">Determina el cliente a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteCliente(string nombre)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE clientes SET Activo = @activo WHERE Nombre = @nombre";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@nombre", nombre);
                eliminar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los clientes
        /// </summary>
        /// <returns>Devuelve una tabla con todos los clientes</returns>
        public DataTable getAllClientes()
        {
            DataTable clientes = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM clientes";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(clientes);
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                clientes = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return clientes;
        }

        /// <summary>
        /// Obtiene un cliente
        /// </summary>
        /// <param name="nombre">Determina el cliente a obtener</param>
        /// <returns>Devuelve un objeto cliente</returns>
        public clientes getCliente(string nombre)
        {
            clientes cliente = new clientes();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM clientes WHERE Nombre = @nombre";
                listado.Parameters.AddWithValue("@nombre", nombre);
                MySqlDataReader lector = listado.ExecuteReader();
                while (lector.Read())
                {
                    cliente.ID = Convert.ToInt16(lector["id"].ToString());
                    cliente.Contacto = lector["Contacto"].ToString();
                    cliente.Nombre = lector["Nombre"].ToString();
                    cliente.Cuit = lector["Cuit"].ToString();
                    cliente.Direccion = lector["Direccion"].ToString();
                    cliente.Mail = lector["Mail"].ToString();
                    cliente.Activo = Convert.ToBoolean(lector["Activo"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                cliente = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
                
            }

            return cliente;
        }
    }
}
